#!/bin/bash

# 脚本名称：build.sh
# 描述：快速构建deb脚本，用于解析参数、调用命令和显示帮助。
# 作者：wangpenglong
# 创建日期：2024年05月10日

# 开启调试模式，显示脚本执行过程 -x;
# 开启错误处理，脚本执行出错时退出 -e;
# set -ex
set -e

VERSION="1.0.0"
AUTHOR="wangpenglong"
DATE="2024年05月10日"

# 帮助信息
help_info() {
	echo "使用方法：$0 [选项]"
	echo "  -h, --help         		显示帮助信息"
	echo "  -v, --version      		显示脚本版本信息"
	echo "  -c, --clean        		清空构建的文件"
	echo "  -r, --replace_url 		替换url为内网url"
	echo "  -b, --build        		构建软件包"
}

# 版本信息
version_info() {
	echo "脚本版本：${VERSION}"
	echo "作者：${AUTHOR}"
	echo "创建日期：${DATE}"
}

#添加参数clean，清理编译出的所有内容
function clean() {
	git clean -fdx -e '*.deb' -e '*.rpm'   #清除新建or添加的文件
	rm -rf ../VSCode-linux-*
	# git reset --hard #清除修改的文件
}

#替换url为内网url
function replace_url() {
	#修改yarn.lock中地址
	NPM_URL='https://registry.yarnpkg.com'
	NPM_LOCAL_SEVER="http://kylinos.zz.gitea.com:3000"

	for i in $(find -name yarn.lock); do
		sed -i "s#${NPM_URL}#${NPM_LOCAL_SEVER}#g" $i
	done

	#替换calculate-deps.ts中地址
	calculate_deps_files=("build/linux/debian/calculate-deps.ts" "build/linux/debian/calculate-deps.js")
	dpkgShlibdepsUrl="https://raw.githubusercontent.com/chromium"
	dpkgShlibdepsUrl_local="http://127.0.0.1:9099"
	for calculate_deps_file in ${calculate_deps_files[@]}; do
		echo "替换${calculate_deps_file}中的地址"
		sed -i "s#${dpkgShlibdepsUrl}#${dpkgShlibdepsUrl_local}#g" ${calculate_deps_file}
		sed -i "s/\/third_party//" ${calculate_deps_file}
	done

	install_sysroot_files=("build/linux/debian/install-sysroot.ts" "build/linux/debian/install-sysroot.js")
	URL_PREFIX="https://msftelectron.blob.core.windows.net"
	URL_PREFIX_local="http://127.0.0.1:9099"
	sysrootJSONUrl="https://raw.githubusercontent.com/electron"
	sysrootJSONUrl_local="http://127.0.0.1:9099/sysroots"
	for install_sysroot_file in ${install_sysroot_files[@]}; do
		echo "替换${install_sysroot_file}中的地址"
		sed -i "s#${URL_PREFIX}#${URL_PREFIX_local}#g" ${install_sysroot_file}
		sed -i "s#${sysrootJSONUrl}#${sysrootJSONUrl_local}#g" ${install_sysroot_file}
		sed -i "s/https/http/g" ${install_sysroot_file}
	done
	echo "electron_mirror=http://127.0.0.1:9099/electron/" > .npmrc
	ELECTRON_URL="https://electronjs.org"
	sed -i "s#${ELECTRON_URL}#${URL_PREFIX_local}#g" .yarnrc
	echo "[done] replace local url end."
}

function build(){
	#start build
	echo "[start] build start."
	set -ex

	#设置环境变量，构建软件包时，可不下载 electron二进制和 playwright browser包
	export ELECTRON_SKIP_BINARY_DOWNLOAD=1
	export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1

	#CHILD_CONCURRENCY 控制并行运行以构建节点模块的子进程的数量。
	#将此数字设置为 1 将导致节点模块按顺序构建，这可以避免使用 node-gyp 的 Windows 上的链接器错误。
	# CHILD_CONCURRENCY=1 yarn --frozen-lockfile --check-files --network-timeout 180000
	# yarn --frozen-lockfile --check-files --network-timeout 180000
	yarn

	#关闭telemetry，node_modules也会有地址
	./close_telemetry.sh
	#检查
	yarn monaco-compile-check
	yarn valid-layers-check
	#编译
	yarn gulp compile-build
	yarn gulp compile-extension-media
	yarn gulp compile-extensions-build
	#压缩代码
	yarn gulp minify-vscode
	yarn gulp "vscode-linux-x64-min-ci" #this will download electron,need change code.
	#打包
	yarn gulp "vscode-linux-x64-build-deb"
	cp .build/linux/deb/*/deb/*.deb .

	echo "[done] build end."
}

# 解析参数
parse_args() {
	while [[ $# -gt 0 ]]; do
		key="$1"

		case $key in
			-h|--help)
			help_info
			exit 0
			;;
			-v|--version)
			version_info
			exit 0
			;;
			-c|--clean)
			clean
			exit 0
			;;
			-r|--replace_url)
			replace_url
			exit 0
			;;
			-b|--build)
			build
			exit 0
			;;
			*)
			echo "未知选项：$1"
			help_info
			exit 1
			;;
		esac
		shift
	done
	# 没有选项时，显示帮助信息
	if [ $# -eq 0 ]; then
		help_info
		exit 1
	fi
}

# 主函数
main() {
	parse_args "$@"
}

# 调用主函数
main "$@"
